/*
   FieldVis - A Tool for Visualizing Astrophysical Magnetohydrodynamic Flow
   
   Copyright (C) 2006 - 2008     FieldVis Development Team
  
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
  
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
  
   You should have received a copy of the GNU General Public License along
   with this program; if not, write to the Free Software Foundation, Inc.,
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

   File     : StreamlinePath.h
   Author   : Blayne Field
   
   Purpose  : Definition header file for the StreamlinePath class.  This class
              holds the coordinates and directions of a streamline.
*/

#ifndef STREAMLINE_PATH_H
#define STREAMLINE_PATH_H

#include <fstream>
#include <cmath>
#include <list>

#include "Point.h"
#include "Vector3D.h"
#include "Field.h"
#include "CubicSplinePolynomial3D.h"


class StreamlinePath
{
public:
   StreamlinePath();
   StreamlinePath(const StreamlinePath &slp);
   StreamlinePath(StreamlinePath forward, StreamlinePath backward);
   StreamlinePath(const std::list<BoundVector3D> &locs, const bool exits);
   ~StreamlinePath();

   void ScaleByFactor(float factor);
   void SmoothPath(VectorField *field);

   // overloaded = operator
   StreamlinePath & operator=(const StreamlinePath & toCopy);

   // accessors
   int GetPointsCalculated() const     { return(pointsCalculated);}
   Point *GetCoordinates() const       { return(coords);}
   Vector3D *GetDirections() const     { return(directions);}
   Point GetLastCoordinate() const     { return(coords[pointsCalculated-1]);}
   Vector3D GetLastDirection() const   { return(directions[pointsCalculated-1]);}
   int GetStartPointIndex() const      { return(startPointIndex);}
   bool GetExitsGrid() const           { return(exitsGrid);}

private:  

   Point *coords;
   Vector3D *directions;
   int pointsCalculated;
   int startPointIndex;
   bool exitsGrid;
};

#endif
